package www.wmx.com.xssc.util.time;

import lombok.extern.slf4j.Slf4j;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
public class DateFormatterUtil {

    private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd");

//    public static LocalDateTime StrToLocalDateTime(String dateStr) {
//        String formattedDateStr = dateStr
//                .replace("年", "-")
//                .replace("月", "-")
//                .replace("日", "");
//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
//        LocalDate date = LocalDate.parse(formattedDateStr, formatter);
//        // 如果需要 LocalDateTime，可以这样做：
//        LocalDateTime dateTime = date.atStartOfDay();
//        return  dateTime;
//    }

    public static LocalDateTime StrToLocalDateTime(String dateStr) {
        String formattedDateStr = dateStr
                .replace("年", "-")
                .replace("月", "-")
                .replace("日", "").replace("-00","-01");

        // 处理日期为"00"的情况
        if (formattedDateStr.endsWith("-00")) {
            formattedDateStr = formattedDateStr.replace("-00", "-01");
        }

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate date = LocalDate.parse(formattedDateStr, formatter);
        // 如果需要 LocalDateTime，可以这样做：
        LocalDateTime dateTime = date.atStartOfDay();
        return dateTime;
    }

    public static LocalDateTime[] parseDateRange(String dateRange) {
        Pattern pattern = Pattern.compile(
                "(\\d{4})年(\\d{1,2})月(-(\\d{4})年(\\d{1,2})月)?|" + // 匹配 "YYYY年MM月" 或 "YYYY年MM月-YYYY年MM月"
                        "(\\d{4})-(\\d{2})-(\\d{2})到(\\d{4})-(\\d{2})-(\\d{2})|" + // 匹配 "YYYY-MM-DD到YYYY-MM-DD"
                        "(\\d{4})-(\\d{2})-(\\d{2})至(\\d{4})-(\\d{2})-(\\d{2})" // 匹配 "YYYY-MM-DD至YYYY-MM-DD"
        );
        Matcher matcher = pattern.matcher(dateRange);

        if (!matcher.find()) {
            throw new IllegalArgumentException("Unsupported date range format: " + dateRange);
        }

        LocalDate startDate, endDate;
        if (matcher.group(1) != null) { // 处理 "YYYY年MM月" 或 "YYYY年MM月-YYYY年MM月"
            startDate = LocalDate.of(Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)), 1);
            if (matcher.group(4) != null) { // 如果有结束年份和月份
                endDate = LocalDate.of(Integer.parseInt(matcher.group(4)), Integer.parseInt(matcher.group(5)), startDate.lengthOfMonth());
                endDate = endDate.minusDays(1); // 如果需要结束日期为最后一天的前一天，则减去一天
                // 如果需要结束日期为最后一天的23:59:59.999999999，则保留下面的转换
                // endDateTime = endDate.atTime(23, 59, 59, 999999999);
            } else { // 如果没有结束年份和月份，默认为开始月份的最后一天
                endDate = startDate.withDayOfMonth(startDate.lengthOfMonth());
                // 如果需要结束日期为最后一天的23:59:59.999999999，则进行转换
                // endDateTime = endDate.atTime(23, 59, 59, 999999999);
            }
        } else if (matcher.group(6) != null) { // 处理 "YYYY-MM-DD到YYYY-MM-DD"
            startDate = LocalDate.parse(matcher.group(6) + "-" + matcher.group(7) + "-" + matcher.group(8), DATE_FORMAT);
            endDate = LocalDate.parse(matcher.group(9) + "-" + matcher.group(10) + "-" + matcher.group(11), DATE_FORMAT);
            // 如果需要结束日期为最后一天的23:59:59.999999999，则进行转换
            // endDateTime = endDate.atTime(23, 59, 59, 999999999);
        } else if (matcher.group(12) != null) { // 处理 "YYYY-MM-DD至YYYY-MM-DD"
            startDate = LocalDate.parse(matcher.group(12) + "-" + matcher.group(13) + "-" + matcher.group(14), DATE_FORMAT);
            endDate = LocalDate.parse(matcher.group(15) + "-" + matcher.group(16) + "-" + matcher.group(17), DATE_FORMAT);
            // 如果需要结束日期为最后一天的23:59:59.999999999，则进行转换
            // endDateTime = endDate.atTime(23, 59, 59, 999999999);
        } else {
            throw new IllegalStateException("Unexpected parsing state"); // 理论上不应该到达这里
        }
        // 注意：这里我们假设开始时间是当天的开始（00:00:00），但结束时间没有直接设置
        // 因为结束日期可能是一个完整的日期范围，或者只是需要知道是哪一天
        // 如果需要结束时间为当天的23:59:59.999999999，则应该分别设置并返回 LocalDateTime 对象
        LocalDateTime startDateTime = startDate.atStartOfDay();
        LocalDateTime endDateTime = endDate.atTime(23, 59, 59, 999999999); // 如果需要这样的结束时间

        // 如果只需要返回日期范围（不包括具体时间），则只返回 LocalDate 对象
        // return new LocalDate[]{startDate, endDate};

        // 如果需要包含具体时间，则返回 LocalDateTime 对象
        return new LocalDateTime[]{startDateTime, endDateTime};
    }

    public static void main(String[] args) {
        LocalDateTime[] range1 = parseDateRange("2020年8月-2023年12月");
        System.out.println("Range 1: Start=" + range1[0].format(DATE_FORMAT) + ", End=" + range1[1].format(DATE_FORMAT));

        LocalDateTime[] range2 = parseDateRange("2020-08-01到2023-12-31");
        System.out.println("Range 2: Start=" + range2[0].format(DATE_FORMAT) + ", End=" + range2[1].format(DATE_FORMAT));

        LocalDateTime[] range3 = parseDateRange("2022-01-01至2023-12-31");
        System.out.println("Range 3: Start=" + range3[0].format(DATE_FORMAT) + ", End=" + range3[1].format(DATE_FORMAT));
    }
}